www.gusucode.com > VC 3D弹道仿真程序源码文件-源码程序 > VC 3D弹道仿真程序源码文件-源码程序/code/ReferenceFrame.cpp
/******************************************************************************** **** 名称:坐标转换模块 ***** **** 编写:孙瑞胜 李伟明 **** 日期:2011年7月10日 ***** *********************************************************************************/ #include <math.h> #include <stdio.h> #include <malloc.h> #include <fstream.h> #include "./myInclude/myMatrix.h" #include "ReferenceFrame.h" #include "EarthModel.h" #include "3DModel.h" const double PI=3.1415926; const double RAD=180./PI; #define Rf 0.00335281317790 /*1.0/298.257*/ /*地球扁率*/ //Download by http://www.NewXing.com extern double now_time ; CFrameofRef::CFrameofRef() { } CFrameofRef::~CFrameofRef() { } /**************************************************************************/ /*** 名称:矩阵相乘 程序模块 ***/ /*** 功能:实现c[m][n]=a[m][p]*b[p][n] ***/ /**************************************************************************/ void CFrameofRef::MatrixMultiply(int m, int p, int n, const double *a, const double *b, double *c) { double temp=0; for(int i=0; i<m; i++) for(int j=0; j<n; j++) { temp=0; for(int k=0; k<p; k++) { temp+=(a[p*i+k]) * (b[k*n+j]); } c[n*i+j]=temp; } return; } /**************************************************************************/ /*** 名称:矩阵转置 程序模块 ***/ /*** 功能:实现b[n][m]=a[m][n] ***/ /**************************************************************************/ void CFrameofRef::MatrixTrans(int m, int n, double *a, double *b) { int i,j; for( i=0; i<m; i++) { for( j=0; j<n; j++) { b[j*m+i]=a[n*i+j]; } } return ; } /**********************************************************/ /*** 地面(发射)系到弹道系坐标转换程序模块 (LOH) ***/ /*** XS_l[3]为地面系中的分量, XS_t[3]为弹道系中的分量, pFlag='l2t' or 't2l' ***/ /**********************************************************/ void CFrameofRef::Ground2Traject( double theta, double Psi_V , double XS_l[3], double XS_t[3], const char* pFlag ) { double Conversion_t2l[3][3], Conversion_l2t[3][3]= //地面(发射)系到弹道系坐标转换矩阵 { cos( theta/RAD ) * cos( Psi_V/RAD ) , sin( theta/RAD ), -cos( theta/RAD ) * sin( Psi_V/RAD ) , -sin( theta/RAD ) * cos( Psi_V/RAD ), cos( theta/RAD ), sin( theta/RAD ) * sin( Psi_V/RAD ) , sin( Psi_V/RAD ) , 0 , cos( Psi_V/RAD ) }; if ( ( pFlag[0]== 'l' ) && ( pFlag[2]== 't' ) ) { MatrixMultiply( 3, 3, 1, *Conversion_l2t, XS_l, XS_t ); } else if ( ( pFlag[0]== 't' ) && ( pFlag[2]== 'l' ) ) { MatrixTrans( 3, 3, *Conversion_l2t, *Conversion_t2l) ; MatrixMultiply( 3, 3, 1, *Conversion_t2l, XS_l, XS_t ); } else { cout<<"error: no fitable flag of options! options must be 'l2t or t2l' "<<endl ; ; } return ; } /**********************************************************/ /*** 弹道系到速度系坐标转换程序模块 (LHV) ***/ /*** XS_t[3]为弹道系中的分量, XS_v[3]速度系中的分量 ***/ /**********************************************************/ void CFrameofRef::Traject2Vel( double gama_v , double XS_t[3], double XS_v[3] ) { double Conversion_t2v[3][3]= //弹道系到速度系坐标转换矩阵 { 1 , 0 , 0 , 0 , cos( gama_v/RAD ) , sin( gama_v/RAD ) , 0 , -sin( gama_v/RAD ), cos( gama_v/RAD ) }; MatrixMultiply( 3, 3, 1, *Conversion_t2v, XS_t, XS_v ); return ; } /**********************************************************/ /*** 速度系到弹体系坐标转换程序模块 (LVB) ***/ /*** XS_v[3]速度系中的分量 , XS_b[3]为弹体系中的分量 ***/ /**********************************************************/ void CFrameofRef::Vel2Body( double alpha, double beta , double XS_v[3], double XS_b[3] ) { double Conversion_v2b[3][3]= //速度系到弹体系坐标转换矩阵 { cos( alpha/RAD ) * cos( beta/RAD ) , sin( alpha/RAD ) , -cos( alpha/RAD ) * sin( beta/RAD ) , -sin( alpha/RAD ) * cos( beta/RAD ) , cos( alpha/RAD ) , sin( alpha/RAD ) * sin( beta/RAD ) , sin( beta/RAD ) , 0 , cos( beta/RAD ) }; MatrixMultiply( 3, 3, 1, *Conversion_v2b, XS_v, XS_b ); return ; } /**********************************************************/ /*** 地面(发射)系到弹体系坐标转换程序模块 (LOB) ***/ /*** XS_l[3]为地面系中的分量, XS_b[3]为弹体系中的分量 ***/ /**********************************************************/ void CFrameofRef::Ground2Body( double pitch, double yaw, double roll, double XS_l[3], double XS_b[3] ) {// CITA PESAI gamma double Conversion_l2b[3][3]= //地面系到弹体系坐标转换矩阵 { cos( pitch/RAD ) * cos( yaw/RAD ) , sin( pitch/RAD ) , -cos( pitch/RAD ) * sin( yaw/RAD ) , ( -sin( pitch/RAD ) * cos( yaw/RAD ) * cos( roll/RAD ) + sin( yaw/RAD ) * sin( roll/RAD ) ) , cos( pitch/RAD ) * cos( roll/RAD ) , ( sin( pitch/RAD ) * sin( yaw/RAD ) * cos( roll/RAD ) + cos( yaw/RAD ) * sin( roll/RAD ) ) , ( sin( pitch/RAD ) * cos( yaw/RAD ) * sin( roll/RAD ) + sin( yaw/RAD ) * cos( roll/RAD ) ) , -cos( pitch/RAD ) * sin( roll/RAD ) , ( -sin( pitch/RAD ) * sin( yaw/RAD ) * sin( roll/RAD ) + cos( yaw/RAD ) * cos( roll/RAD ) ) }; MatrixMultiply( 3, 3, 1, *Conversion_l2b, XS_l, XS_b ); return ; } /**********************************************************/ /*** 坐标经纬高到大地空间直角坐标系坐标转换程序模块 ***/ /*** XS_84[3]对应0纬 1经 2高, XS_ecef[3]对应0XE 1YE 2ZE ***/ /**********************************************************/ void CFrameofRef::WGS84_2_ECEF( double XS_84[3], double XS_ecef[3] ) { double R = 6378140/sqrt( 1 - Rf*Rf*sin( XS_84[0]/RAD )*sin( XS_84[0]/RAD ) ); XS_ecef[0] = ( R+XS_84[2] ) * cos( XS_84[0]/RAD ) * cos( XS_84[1]/RAD ); XS_ecef[1] = ( R+XS_84[2] ) * cos( XS_84[0]/RAD ) * sin( XS_84[1]/RAD ); XS_ecef[2] = ( R*(1-Rf*Rf) + XS_84[2] ) * sin( XS_84[0]/RAD ); return; } /**********************************************************/ /*** 坐标经纬高到大地空间直角坐标系坐标转换程序模块 ***/ /*** XS_84[3]对应0纬 1经 2高, XS_ecef[3]对应0XE 1YE 2ZE ***/ /**********************************************************/ void CFrameofRef::ECEF_2_WGS84( double XS_ecef[3], double XS_84[3] ) { double R ; for (int i=0; i<4; i++ ) { XS_84[0] = atan( ( XS_ecef[2]/sqrt( XS_ecef[0]*XS_ecef[0]+XS_ecef[1]*XS_ecef[1] ) )*( 1 + 6378140*Rf*Rf*sin( XS_84[0]/RAD )/( XS_ecef[2]*sqrt( 1-Rf*Rf*sin( XS_84[0] )*sin( XS_84[0]/RAD ) ) ) ) ); } XS_84[0] = XS_84[0] * RAD ; XS_84[1] = atan( XS_ecef[1]/XS_ecef[0] ) ; R = 6378140/sqrt( 1 - Rf*Rf*sin( XS_84[0]/RAD )*sin( XS_84[0]/RAD ) ); XS_84[2] = sqrt( XS_ecef[0]*XS_ecef[0]+XS_ecef[1]*XS_ecef[1] )/cos( XS_84[0]/RAD ) - R ; return; } /**************************************************************/ /*** 发射惯性坐标系到地面坐标系转换程序模块 (LAO ) ***/ /*** XS_i[3]为发射惯性系中的分量, XS_l[3]为地面系中的分量 ***/ /**************************************************************/ void CFrameofRef::Inertial2Ground( double XS_i[3], double XS_l[3] ) { C3DModel * p3DModel_R = new C3DModel ; CEarth * pEarth_R = new CEarth ; double we_x, we_y, we_z ; pEarth_R->Cal_we_xyz( p3DModel_R->B0, p3DModel_R->A0, we_x, we_y, we_z ) ; double Conversion_i2l[3][3]= //发射惯性坐标系到地面坐标系转换矩阵 { 1 , we_z*now_time , -we_y*now_time , -we_z*now_time , 1 , we_x*now_time , we_y*now_time , -we_x*now_time , 1 }; MatrixMultiply( 3, 3, 1, *Conversion_i2l, XS_i, XS_l ); return; } /**********************************************************/ /*** 地面坐标系到导航(东北天)坐标系转换程序模块 (LON) ***/ /*** XS_l[3]为地面系中的分量, XS_n[3]为导航系中的分量 ***/ /**********************************************************/ void CFrameofRef::Ground2Nav( double alpha, double XS_l[3], double XS_n[3] ) { double Conversion_l2n[3][3]= //地面坐标系到导航(东北天)坐标系转换矩阵 { sin( alpha/RAD ) , 0 , cos( alpha/RAD ) , cos( alpha/RAD ) , 0 , -sin( alpha/RAD ) , 0 , 1 , 0 }; MatrixMultiply( 3, 3, 1, *Conversion_l2n, XS_l, XS_n ); return; } /******************************************************************/ /*** 导航(东北天)到地面坐标系坐标系转换程序模块 (LNO) ***/ /*** XS_n[3]为导航系中的分量, XS_ecef[3]为地面坐标系中的分量 ***/ /******************************************************************/ void CFrameofRef::Nav2ECEF( double XS_n[3], double XS_ecef[3] ) { // double Conversion_n2E[3][3]= //导航(东北天)到地面坐标系坐标系转换矩阵 { }; // MatrixMultiply( 3, 3, 1, *Conversion_n2E, XS_n, XS_ecef ); return; } /*********************************************************************************************/ /*程序模块:目标系到导航系下的坐标转换 */ /*函数名:Lan_to_NavCoor() */ /*参数:alfa,Naviga,Launch_F */ /*返回:Loc 导航系下坐标值 */ /*作者: 胡锐 */ /*********************************************************************************************/ /* Loc CTRANS::Lan_to_NavCoor( double alfa , Loc Launch_F )//方位角(弧度)、 发射系下坐标 { Loc Naviga; //导航系下坐标 double cfn[3][3]= //发射系到导航系下的坐标转换矩阵 { { sin( alfa ), 0 , cos( alfa ) }, { cos( alfa ), 0 , -sin( alfa ) }, { 0 , 1 , 0 }, }; //发射系坐标转换到导航系 Naviga.x = cfn[0][0] * Launch_F.x + cfn[0][1] * Launch_F.y + cfn[0][2] * Launch_F.z ; Naviga.y = cfn[1][0] * Launch_F.x + cfn[1][1] * Launch_F.y + cfn[1][2] * Launch_F.z ; Naviga.z = cfn[2][0] * Launch_F.x + cfn[2][1] * Launch_F.y + cfn[2][2] * Launch_F.z ; return Naviga ; } */ /*********************************************************************************************/ /*程序模块:速度发射系到导航系下的转换 */ /*参数:alfa,Launch_F */ /*函数名:Lan_to_NavCoor_V() */ /*返回:Vel 导航系下速度 */ /*作者: 胡锐 */ /*********************************************************************************************/ /* Vel CTRANS::Lan_to_NavCoor_V( double alfa , Vel Launch_V )//方位角(弧度)、发射系下速度 { Vel Naviga_V; //导航系下坐标 double cfn[3][3]= //发射系到导航系下的坐标转换矩阵 { { sin( alfa ), 0 , cos( alfa ) }, { cos( alfa ), 0 , -sin( alfa ) }, { 0 , 1 , 0 }, }; //发射系坐标转换到导航系 Naviga_V.Vx = cfn[0][0] * Launch_V.Vx + cfn[0][1] * Launch_V.Vy + cfn[0][2] * Launch_V.Vz ; Naviga_V.Vy = cfn[1][0] * Launch_V.Vx + cfn[1][1] * Launch_V.Vy + cfn[1][2] * Launch_V.Vz ; Naviga_V.Vz = cfn[2][0] * Launch_V.Vx + cfn[2][1] * Launch_V.Vy + cfn[2][2] * Launch_V.Vz ; return Naviga_V ; } */ /*********************************************************************************************/ /*程序模块:速度发射系到导航系下的转换 */ /*函数名:Lan_to_NavCoor_V() */ /*参数:alfa,Launch_F */ /*返回:Vel 导航系下速度 */ /*作者: 胡锐 */ /*********************************************************************************************/ /* Accel CTRANS::Launch_to_Bomb_Coor_A( Loc Angle , Accel Launch_A )//欧拉角(弧度)、发射系下加速度 { Accel Bomb_A ; double cfb[3][3] = //发射系到弹体系的转换矩阵 { { cos( Angle.x ) * cos( Angle.y ) , sin( Angle.x ) , -cos( Angle.x ) * sin( Angle.y ) }, { -sin( Angle.x ) * cos( Angle.y ) * cos( Angle.z ) + sin( Angle.y ) * sin( Angle.z ) , cos( Angle.x ) * cos( Angle.z ) , sin( Angle.x ) * sin( Angle.y ) * cos( Angle.z ) + cos( Angle.y ) * sin( Angle.z ) }, { sin( Angle.x ) * cos( Angle.y ) * sin( Angle.z ) + sin( Angle.y ) * cos( Angle.z ) , -cos( Angle.x ) * sin( Angle.z ) , -sin( Angle.x ) * sin( Angle.y ) * sin( Angle.z ) + cos( Angle.y ) * cos( Angle.z ) } } ; //发射系坐标转换到导航系 Bomb_A.Ax = cfb[0][0] * Launch_A.Ax + cfb[0][1] * Launch_A.Ay + cfb[0][2] * Launch_A.Az ; Bomb_A.Ay = cfb[1][0] * Launch_A.Ax + cfb[1][1] * Launch_A.Ay + cfb[1][2] * Launch_A.Az ; Bomb_A.Az = cfb[2][0] * Launch_A.Ax + cfb[2][1] * Launch_A.Ay + cfb[2][2] * Launch_A.Az ; return Bomb_A ; } */ /*********************************************************************************************/ /*程序模块:导航系增量到空间直角坐标系下的坐标增量转换 */ /*函数名:Nav_to_AngleCoor() */ /*参数:Delt_Naviga,Space_Point */ /*返回:Loc 空间直角坐标系下的增量输出 */ /*作者: 胡锐 */ /*********************************************************************************************/ /* Loc CTRANS::Nav_to_AngleCoor( Loc Delt_Naviga , Gps Space_Point )//导航坐标增量,前点的经纬高(角度) { Loc Angle ; double cne[3][3]= //导航系到大地系下的坐标转换矩阵 { { -sin( Space_Point.l / R_D ) , -sin( Space_Point.f / R_D ) * cos( Space_Point.l / R_D ) , cos( Space_Point.f / R_D ) * cos( Space_Point.l / R_D) }, { cos( Space_Point.l / R_D ) , -sin( Space_Point.f / R_D ) * sin( Space_Point.l / R_D ) , cos( Space_Point.f / R_D ) * sin( Space_Point.l / R_D) }, { 0 , cos( Space_Point.f / R_D ) , sin( Space_Point.f / R_D ) } }; //导航增量转换到空间直角坐标增量 Angle.x = cne[0][0] * Delt_Naviga.x + cne[0][1] * Delt_Naviga.y + cne[0][2] * Delt_Naviga.z ; Angle.y = cne[1][0] * Delt_Naviga.x + cne[1][1] * Delt_Naviga.y + cne[1][2] * Delt_Naviga.z ; Angle.z = cne[2][0] * Delt_Naviga.x + cne[2][1] * Delt_Naviga.y + cne[2][2] * Delt_Naviga.z ; return Angle ; } */ /*********************************************************************************************/ /*程序模块:空间直角坐标系下的坐标到空间球坐标转换 */ /*函数名:Angle_to_TransitCoor() */ /*参数:Angle,Space_Point */ /*返回:Gps 84坐标系下的经纬高度坐标 */ /*作者: 胡锐 */ /*********************************************************************************************/ /* Gps CTRANS::Angle_to_TransitCoor( Loc Angle , Gps Space_Point )//空间直角坐标,上一点经纬高(角度) { Gps Space ; double temp1 , temp2 , temp , temp3 , N; //中间变量 temp2 = Space_Point.f / R_D ; //迭代法求发射点处纬度 temp1 = temp2 - 0.02 ; temp3 = Angle.z / sqrt( Angle.x * Angle.x + Angle.y * Angle.y ); while ( fabs( temp2 - temp1 ) > EPSILON ) { temp1 = temp2; temp2 = atan( temp3 * ( 1 + R * e2 * sin( temp1 ) / Angle.z / sqrt( 1 -e2 * sin( temp1 ) * sin( temp1 ) ) ) ); } //迭代法解算出纬度(弧度) Space.f = temp2 * R_D; //纬度值(角度) temp= atan ( Angle.y / Angle.x ); //经度值(弧度) if ( Space_Point.l > 45 && temp < 0 ) //解算出的经度弧度值得出应该的角度值 Space.l = temp * R_D + 180; else if ( Space_Point.l < -45 && temp > 0) Space.l = temp * R_D - 180; else Space.l = temp * R_D; N = R / sqrt( 1 - e2 * sin( temp2 ) * sin( temp2 )); Space.h = sqrt( Angle.x * Angle.x + Angle.y * Angle.y ) / cos( temp2 ) - N; //高度 return ( Space ) ; } */ /*********************************************************************************************/ /*程序模块:空间球坐标到空间直角坐标系下的坐标转换 */ /*函数名:Transit_to_AngleCoor() */ /*参数:Space_Point */ /*返回:空间直角坐标系下的坐标 */ /*作者: 胡锐 */ /*********************************************************************************************/ /* Loc CTRANS::Transit_to_AngleCoor( Gps Space_Point ) { double N ; Loc Angle ; N = R / sqrt( 1 - e2 * sin( Space_Point.f / R_D ) * sin( Space_Point.f / R_D ) ); //卯酉圈曲率半径 //目标点的空间直角坐标 X、Y、Z Angle.x = ( N + Space_Point.h ) * cos ( Space_Point.f / R_D ) * cos ( Space_Point.l / R_D ); Angle.y = ( N + Space_Point.h ) * cos ( Space_Point.f / R_D ) * sin ( Space_Point.l / R_D ); Angle.z = ( N * ( 1 - e2 ) + Space_Point.h ) * sin ( Space_Point.f / R_D ); return ( Angle ) ; } */ /*********************************************************************************************/ /**程序模块:计算初始投弹点的经、纬、高度及导航速度、弹体比力 **/ /**函数名:Cal_PourPoint() **/ /**参数:deltX:水平射程,deltY:垂直高度,delta:方位角, **/ /** velocity_X, velocity_Y, velocity_Z:发射坐标系下的三个方向上的速度 **/ /** phi:目标点纬度,lamda:目标点经度,h:目标点高度 **/ /** phi1:发射点纬度,lamda1:发射点经度,h1:发射点高度 **/ /** 导航系下三个速度:Nav_Vx , Nav_Vy , Nav_Vz **/ /** 弹体系下三个加速度:Bomb_Ax , Bomb_Ay , Bomb_Az **/ /**功能:由投弹点与目标点的关系反算出投弹点的经纬度坐标 **/ /*********************************************************************************************/ /* void CTRANS::Cal_PourPoint( double *error , // deltX , deltY , delta , velocity_X , velocity_Y , velocity_Z double *theodolite, // phi , lamda , h(目标点) double *out_transit // phi1 , lamda1 , h1 , 导航速度 , 弹体加速度(投弹点) ) { int i; // Loc Angle_TagetCoor ; // Gps Space_TagatCoor ,TagatTransit ; Vel Naviga_V ; Space.f = *theodolite ; //提取目标点经、纬、高(角度、角度、米) Space.l = *( theodolite + 1 ) ; Space.h = *( theodolite + 2 ) ; // Space_TagatCoor.f = TagatTransit.f ; //用于反推时存经、纬、高度 // Space_TagatCoor.l = TagatTransit.l ; // Space_TagatCoor.h = TagatTransit.h ; // Angle_TagetCoor = Transit_to_AngleCoor( TagatTransit ) ;//求目标点的空间直角坐标 Angle = Transit_to_AngleCoor( Space ) ;//求目标点的空间直角坐标 double deltX , deltY , delta; //提取射程、高度、初始方位角(米、米、角度) deltX = *error ; deltY = *( error + 1 ) ; delta = *( error + 2 ) ; DeltX = deltX ; Vel Launch_V ; //提取发射点速度 Launch_V.Vx = *( error + 3 ) ; Launch_V.Vy = *( error + 4 ) ; Launch_V.Vz = *( error + 5 ) ; Last_Launch_V.Vx = *( error + 3 ) ; //用于以后算速度 Last_Launch_V.Vy = *( error + 4 ) ; Last_Launch_V.Vz = *( error + 5 ) ; Accel Bomb_A ; //设定初始点加速度 Bomb_A.Ax = 0 ; Bomb_A.Ay = 0 ; Bomb_A.Az = 0 ; double k , deltx1 , delty1; k = ceil( sqrt( deltX *deltX + deltY * deltY ) / 50 ); //将发射和目标点等分K段 deltx1 = deltX / k; delty1 = deltY / k; double Alfa_TagatCoor ; Alfa = delta / R_D ; if ( delta > 0 ) Alfa_TagatCoor = ( delta - 180 ) / R_D ; //求变坐标原点后方位角(弧度) else Alfa_TagatCoor = ( delta + 180 ) / R_D ; Loc TagatCoor_P , Launch_P; for ( i = 1 ; i <= k ; i++) { TagatCoor_P.x = i * deltx1 ; //目标系下空间点坐标 TagatCoor_P.y = i * delty1 ; TagatCoor_P.z = 0 ; Space = Calculate( Alfa_TagatCoor , TagatCoor_P , Space) ; //求经纬高 } Launch_P.x = 0 ; Launch_P.y = deltY ; Launch_P.z = 0 ; Last_Naviga = Lan_to_NavCoor( Alfa , Launch_P ) ; //求发射点导航系下坐标 // Angle = Transit_to_AngleCoor( Space_TagatCoor ) ;//计算发射点空间直角坐标为后面计算弹道点准备 Naviga_V = Lan_to_NavCoor_V( Alfa , Launch_V ) ; //发射到导航速度转换 double Delt_H ; //求真实离海拔高 Delt_H = R - sqrt( R * R - deltX * deltX ) ; *out_transit = Space.f ; *( out_transit + 1 ) = Space.l ; *( out_transit + 2 ) = Space.h - Delt_H ; // Space.f = Space_TagatCoor.f ; // Space.l = Space_TagatCoor.l ; // Space.h = Space_TagatCoor.h ; *( out_transit + 3 ) = Naviga_V.Vx ; *( out_transit + 4 ) = Naviga_V.Vy ; *( out_transit + 5 ) = Naviga_V.Vz ; *( out_transit + 6 ) = Bomb_A.Ax ; *( out_transit + 7 ) = Bomb_A.Ay ; *( out_transit + 8 ) = Bomb_A.Az ; return ; } */ /**********************************************************************************************/ /**计算时时经纬度 **/ /**函数名:coordtrans() **/ /**参数:X:发射坐标下的射程,Y:发射下的垂直直高度,Z:发射下的偏航, **/ /** velocity_X:发射下射程速度,velocity_Y:发射下垂直速度,velocity_z发射下偏航速度 **/ /** 三个欧拉角 **/ /** v_east,v_north,v_sky,导航系下的三个方向上的速度 **/ /** Bomb_accel_X , Bomb_accel_X , Bomb_accel_X , 弹体系下的三个方向上的比力 **/ /** *phi:返回的纬度,*lamda:返回的经度,*h:返回的高度 **/ /**功能:通过对传递参数的运算给出弹道点的经纬度坐标、导航系下的速度和弹体系下的比力 **/ /**********************************************************************************************/ /* void CTRANS::coordtrans( double *launchzuobiao,//input: X , Y, Z , velocity_X , velocity_Y, velocity_z,弹体的三个欧拉角 double *returnvalue, //output: phi , lamda, h , V_east , V_north , V_sky , // Bomb_accel_X , Bomb_accel_Y ,Bomb_accel_Z double interval //input: 时间间隔 ) { Loc Launch_F ; Vel Naviga_V , Launch_V ; Accel Bomb_A , Launch_A , Naviga_A ,Naviga_f ; Loc ol_angle ; Launch_F.x = *launchzuobiao ; //提取发射系下坐标 Launch_F.y = *( launchzuobiao + 1 ) ; Launch_F.z = *( launchzuobiao + 2 ) ; Launch_V.Vx = *( launchzuobiao + 3 ) ; //提取发射系下三个速度 Launch_V.Vy = *( launchzuobiao + 4 ) ; Launch_V.Vz = *( launchzuobiao + 5 ) ; ol_angle.x = *( launchzuobiao + 6 ) ; //提取三个欧拉角 ol_angle.y = *( launchzuobiao + 7 ) ; ol_angle.z = *( launchzuobiao + 8 ) ; Space = Calculate( Alfa , Launch_F , Space) ; //求经纬高 Naviga_V = Lan_to_NavCoor_V( Alfa , Launch_V ) ;//求导航速度 // Launch_A.Ax = ( Launch_V.Vx - Last_Launch_V.Vx ) / interval ;//发射系下加速度 // Launch_A.Ay = ( Launch_V.Vy - Last_Launch_V.Vy ) / interval ; // Launch_A.Az = ( Launch_V.Vz - Last_Launch_V.Vz ) / interval ; Naviga_A.Ax = ( Naviga_V.Vx - Last_Naviga_V.Vx ) / interval ;//导航系下加速度 Naviga_A.Ay = ( Naviga_V.Vy - Last_Naviga_V.Vy ) / interval ; Naviga_A.Az = ( Naviga_V.Vz - Last_Naviga_V.Vz ) / interval ; // Last_Launch_V.Vx = Launch_V.Vx ; // Last_Launch_V.Vy = Launch_V.Vy ; // Last_Launch_V.Vz = Launch_V.Vz ; // Bomb_A = Launch_to_Bomb_Coor_A( ol_angle , Launch_A ) ;//弹体加速度 double Delt_H ; //求真实离海拔高 Delt_H = R - sqrt( R * R - ( DeltX - Launch_F.x )* ( DeltX - Launch_F.x ) ) ; *returnvalue = Space.f ; *( returnvalue + 1 ) = Space.l ; *( returnvalue + 2 ) = Space.h - Delt_H; *( returnvalue + 3 ) = Naviga_V.Vx ; *( returnvalue + 4 ) = Naviga_V.Vy ; *( returnvalue + 5 ) = Naviga_V.Vz ; double g , tempL; // g = 9.806*(1.0-2.0*( Space.h - Delt_H ) / 6371000); //空军气象条件 tempL = sin(returnvalue[0]/R_D) *sin(returnvalue[0]/R_D) ; g = 9.7803267714*(1+0.00527094 * tempL + 0.0000232718 * tempL*tempL)-0.000003086*returnvalue[2] ; // Launch_A.Ax = ( Launch_V.Vx - Last_Launch_V.Vx ) / interval ;//发射系下加速度 // Launch_A.Ay -= -g ;//减去重力的发射系下加速度 // Launch_A.Az = ( Launch_V.Vz - Last_Launch_V.Vz ) / interval ; // Last_Launch_V.Vx = Launch_V.Vx ; // Last_Launch_V.Vy = Launch_V.Vy ; // Last_Launch_V.Vz = Launch_V.Vz ; Last_Naviga_V.Vx = Naviga_V.Vx ; Last_Naviga_V.Vy = Naviga_V.Vy ; Last_Naviga_V.Vz = Naviga_V.Vz ; //补充 double SL, CL, Rm, Rn, w_ien[3], w_enn[3] ; SL = sin(Space.f / R_D) ; CL = cos(Space.f / R_D) ; Rm = Re * (1-2*Rf+3*Rf*SL*SL);//子午面曲率半径/ Rn = Re * (1+Rf*SL*SL); //卯酉面曲率半径/ w_ien[0] = 0.0; w_ien[1] = w_ie * cos(Space.f/R_D); w_ien[2] = w_ie * sin(Space.f/R_D); w_enn[0] = -Naviga_V.Vy/(Rm+Space.h); w_enn[1] = Naviga_V.Vx/(Rn+Space.h); w_enn[2] = Naviga_V.Vx/(Rn+Space.h)*tan(Space.f/R_D); Naviga_f.Ax = Naviga_A.Ax + ( -( 2*w_ien[2] + w_enn[2] ) ) * Naviga_V.Vy + ( 2*w_ien[1] + w_enn[1] ) * Naviga_V.Vz ; Naviga_f.Ay = Naviga_A.Ay + ( 2*w_ien[2] + w_enn[2] ) * Naviga_V.Vx + ( -( 2*w_ien[0] + w_enn[0] ) ) * Naviga_V.Vz ; Naviga_f.Az = Naviga_A.Az + ( -( 2*w_ien[1] + w_enn[1] ) ) * Naviga_V.Vx + ( 2*w_ien[0] + w_enn[0] ) * Naviga_V.Vy + g ; double anb[3] = {Naviga_f.Ax, Naviga_f.Ay ,Naviga_f.Az}; double afa ,Cbn[3][3], fb[3] ; afa = Alfa ; void Cal_Cbn( Loc ol_angle, double afa, double Cbn[3][3] ) ; /////////////////// Cal_Cbn( ol_angle, afa, Cbn ) ; /////////////////// for ( int i=0; i<3; i++ ) { fb[i] = 0; for( int j=0; j<3; j++ ) { fb[i] += Cbn[j][i] * anb[j] ; // 将导航系Naviga_f转到弹体系下 } // fb[i]+=Ab[i]; } // Bomb_A = Launch_to_Bomb_Coor_A( ol_angle , Launch_A ) ;//弹体比力输出 *( returnvalue + 6 ) = Naviga_A.Ax ;//fb[0]; // Naviga_f.Ax ; //Bomb_A.Ax ; *( returnvalue + 7 ) = Naviga_A.Ay ;//fb[1]; //Naviga_f.Ay ; //Bomb_A.Ay ; *( returnvalue + 8 ) = Naviga_A.Az ;//fb[2]; //Naviga_f.Az ; //Bomb_A.Az ; *( returnvalue + 9 ) = fb[0]; //陀螺wx,wy,wz *( returnvalue + 10 ) = fb[1]; *( returnvalue + 11 ) = fb[2]; } */ /**********************************************************************************************/ /**计算时时经、纬、高度 **/ /**函数名:Calculate() **/ /**参数:X:发射坐标下的射程,Y:发射下的垂直直高度,Z:发射下的偏航, **/ /** velocity_X:发射下射程速度,velocity_Y:发射下垂直速度,velocity_z发射下偏航速度 **/ /** 三个欧拉角 **/ /** v_east,v_north,v_sky,导航系下的三个方向上的速度 **/ /** Bomb_accel_X , Bomb_accel_X , Bomb_accel_X , 弹体系下的三个方向上的比力 **/ /** *phi:返回的纬度,*lamda:返回的经度,*h:返回的高度 **/ /**功能:通过对传递参数的运算给出弹道点的经纬度坐标、导航系下的速度和弹体系下的比力 **/ /**********************************************************************************************/ /* Gps CTRANS::Calculate( double Alfa , Loc Launch_F , Gps Space)//方位角、发射坐标、前一点经纬高 { Loc Naviga , Delt_Naviga ; Loc Delt_Angle ; Naviga = Lan_to_NavCoor( Alfa , Launch_F ) ; Delt_Naviga.x = Naviga.x - Last_Naviga.x ;//导航增量 Delt_Naviga.y = Naviga.y - Last_Naviga.y ; Delt_Naviga.z = Naviga.z - Last_Naviga.z ; Last_Naviga.x = Naviga.x ; //存储,为后一点计算用 Last_Naviga.y = Naviga.y ; Last_Naviga.z = Naviga.z ; Delt_Angle = Nav_to_AngleCoor( Delt_Naviga , Space ) ; Angle.x += Delt_Angle.x ; Angle.y += Delt_Angle.y ; Angle.z += Delt_Angle.z ; Space = Angle_to_TransitCoor( Angle , Space ) ; return ( Space ) ; } */ /************************************************************************************************/ /**函数:main() **/ /**功能:调用以上两个函数 **/ /************************************************************************************************/ /* void main(void) { CTRANS CONVER; double error[6] = { 19978.8 , 10000 , -50.5, 0 , 0 , 0 } ; //deltX, deltY, delta,初始速度velocity_X,velocity_Y,velocity_Z double theodolite[3] = { 50 , 30 , 0 } ; //目标点纬度、经度、高度 double launchzuobiao[10] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ; //弹道时时参数,X,Y,Z,velocity_X,velocity_Y,velocity_Z,三个欧拉角 double returnvalue[9] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;//返回的纬经高度、东北天速度、加速度 double i =0 , j = 0 , k = 0 , l = 0 , m = 0 , interval = 0.02 ; double kk[9] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ; int ii = 0 ; FILE *fp , *fp1 , *fp2, *fp3; CONVER.Cal_PourPoint( error , theodolite , kk ) ; printf("%10.5f %10.5f %10.5f " , kk[0] , kk[1] , kk[2] ) ; fp = fopen( "10000m.txt" , "r" ) ; fp1 = fopen( "var.txt" , "w" ) ; fp2 = fopen( "7.31.txt" , "w") ; fp3 = fopen( "1.txt" , "w") ; while ( !feof( fp ) ) { ii++ ; fscanf( fp , "%lf%lf%lf%lf%lf" , &i , &j , &k , &l , &m ) ; launchzuobiao[0] = j ; launchzuobiao[1] = k ; launchzuobiao[2] = l ; // fprintf( fp3 ,"%10.5f %10.5f %10.5f ", j , k , l ) ; CONVER.coordtrans( launchzuobiao , returnvalue , interval ) ; // printf("%10.7f %10.7f %10.5f\n", returnvalue[0] , returnvalue[1] , returnvalue[2] ); // fprintf( fp2 ,"%10.5f\n", Alfa * 57.3) ; fprintf( fp3 ,"%10.5f %10.5f %10.5f\n", returnvalue[0] , returnvalue[1] , returnvalue[2] ) ; } fclose( fp ) ; fclose( fp1 ) ; fclose( fp2 ) ; // fclose( fp3 ) ; } */